package com.echo.servlet.UserServlet;

import com.echo.servlet.BaseServlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;

/**
 * 文件上传Servlet
 * 处理用户头像上传功能
 */
@WebServlet("/upload")
public class FileUploadServlet extends BaseServlet {
    private static final long serialVersionUID = 1L;
    
    // 上传文件存储目录
    private static final String UPLOAD_DIR = "images";
    
    // 最大文件大小 (2MB)
    private static final long MAX_FILE_SIZE = 2 * 1024 * 1024;
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型为JSON
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        // 检查请求是否为multipart类型
        if (!ServletFileUpload.isMultipartContent(request)) {
            out.write("{\"success\": false, \"message\": \"表单不是multipart类型\"}");
            out.flush();
            return;
        }
        
        try {
            // 创建文件上传工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            
            // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
            factory.setSizeThreshold(1024 * 1024); // 1MB
            
            // 设置临时存储目录
            String tempDir = System.getProperty("java.io.tmpdir");
            factory.setRepository(new File(tempDir));
            
            // 创建文件上传解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            
            // 设置最大文件上传值
            upload.setFileSizeMax(MAX_FILE_SIZE);
            
            // 设置请求编码，解决中文文件名乱码问题
            upload.setHeaderEncoding("UTF-8");
            
            // 构建上传目录路径
            // 使用绝对路径确保文件正确保存到webapp/images目录
            String uploadPath = getServletContext().getRealPath("/images");
            
            // 创建上传目录（如果不存在）
            File uploadDir = new File(uploadPath);
            if (!uploadDir.exists()) {
                uploadDir.mkdir();
            }
            
            // 解析请求，获取文件项
            List<FileItem> formItems = upload.parseRequest(request);
            
            // 处理表单中的每个文件项
            String fileUrl = null;
            if (formItems != null && formItems.size() > 0) {
                for (FileItem item : formItems) {
                    // 处理非表单字段（即文件）
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        
                        // 检查文件类型是否为图片
                        String contentType = item.getContentType();
                        if (contentType == null || !contentType.startsWith("image/")) {
                            out.write("{\"success\": false, \"message\": \"请选择有效的图片文件\"}");
                            out.flush();
                            return;
                        }
                        
                        // 检查文件大小
                        if (item.getSize() > MAX_FILE_SIZE) {
                            out.write("{\"success\": false, \"message\": \"文件大小不能超过2MB\"}");
                            out.flush();
                            return;
                        }
                        
                        // 生成唯一文件名，避免覆盖
                        String extension = FilenameUtils.getExtension(fileName);
                        String uniqueFileName = UUID.randomUUID().toString() + "." + extension;
                        
                        // 构建文件存储路径
                        String filePath = uploadPath + File.separator + uniqueFileName;
                        
                        // 保存文件到磁盘
                        File storeFile = new File(filePath);
                        item.write(storeFile);
                        
                        // 构建文件的访问URL（不包含contextPath，因为Thymeleaf的th:src会自动添加）
                        fileUrl = UPLOAD_DIR + "/" + uniqueFileName;
                        break; // 只处理第一个文件
                    }
                }
            }
            
            // 返回成功响应
            if (fileUrl != null) {
                out.write("{\"success\": true, \"fileUrl\": \"" + fileUrl + "\"}");
            } else {
                out.write("{\"success\": false, \"message\": \"未接收到文件\"}");
            }
        } catch (FileUploadException e) {
            // 处理文件上传异常
            out.write("{\"success\": false, \"message\": \"文件上传失败：" + e.getMessage() + "\"}");
            e.printStackTrace();
        } catch (Exception e) {
            // 处理其他异常
            out.write("{\"success\": false, \"message\": \"服务器处理异常：" + e.getMessage() + "\"}");
            e.printStackTrace();
        } finally {
            out.flush();
            out.close();
        }
    }
}